package com.example.gulimall.order;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;


/**
 * 1 pom文件引入amqp场景启动器 RabbitAutoConfiguration自动生效
 * 2 给容器中自动配置了 AmqpAdmin CachingConnetionFactory RabbitMessageTemplate
 * 所有的属性都是在spring.rabbimq
 * @ConfigurationProperties(prefix = "spring.rabbitmq")
 * 3 给配置文件配置spring.rabbitmq的信息
 * 4@EnableRabbit开启自动配置
 * 5 监听消息，使用@RabbitListener;必须有@EnableRabbit才可以
 * RabbitListener 可以标注在类或方法上，说明要监听那些队列
 * RabbitHandler 只可以标注在方法上（两个注解同时使用，重载区分同一个队列里面不同类型的消息）
 */

/**
 * 本地事务失效问题
 *  同一个对象内事务方法互调默认失效，原因绕过了代理对象，事务使用代理对象来控制
 *  解决：使用代理对象来调用事务
 *  1引入spring-boot-starter-aop 引入了aspectj。动态代理
 *  2 开启EnableAspectJAutoProxy动态代理，以后所有的动态代理都是这个代理（即使没有接口也可以创建动态代理）
 *  3 EnableAspectJAutoProxy(exposeProxy = true)对外暴露代理对象
 *  4 本类互调用代理对象
 *   OrderServiceImpl orderService = (OrderServiceImpl) AopContext.currentProxy();
 *         orderService.wmsFeignService();
 */

/**
 * seata控制分布式事务
 * 1 为每一个微服务数据库创建undo_log表
 * 2 按照seata事务协调器 ：seata-server https://github.com/seata/seata/releases
 * 3 导入依赖 spring-cloud-starter-alibaba-seata seata-0.7.1
 * 4 解压并启动seata-server;这个版本必须要和seata-0.7.1一致
 *    registry.conf:注册中心配置：修改注册中心为nacos
 *    file.conf:配置文件在是什么
 *    给业务方法标上seata的全局事务注解
 * 5 所有想用到分布式事务的微服务都需要使用seata的 DataSourceProxy数据源代理自己的数据源,
 * 6 每个微服务都必须导入seata-server中的 file.conf和registry.conf
 *      改这个配置成当前应用的名字加-fescar-service-group： vgroup_mapping.gulimall-ware-fescar-service-group = "default"
 *7 启动测试，给分布式事务的入口标注 @GlobalTransactional和@Transactional 每一个远程的小事务标注@Transactional
 */
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableDiscoveryClient
@EnableRedisHttpSession
@EnableRabbit
@EnableFeignClients
@SpringBootApplication
public  class GulimallOrderApplication {

    public static void main(String[] args) {

        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
